/*
 * Hash.h
 *
 *  Created on: 01/11/2011
 *      Author: damnvb
 */

#ifndef HASH_H_
#define HASH_H_

#include <iostream>
#include <string>
#include <fstream>
#include <vector>
#include "Registro.h"
using namespace std;

class Hash {
public:
	Hash(string nombre_arch_bloques, string nombre_arch_bloques_libres, string nombre_arch_tabla);
//	void guardarDesdeArchivo(string pathArchivo);
	int buscar(Registro *unRegistro);
	void guardar(Registro *unRegistro);
	void borrar(Registro *unRegistro);

	virtual ~Hash();

private:

	static int REG_NO_EN_HASH;
	static int RES_OK;
	string pathBloques;
	string pathBloquesLibres;
	string pathTabla;
	fstream *archBloques;
	fstream *archBloquesLibres;
	fstream *archTabla;

	int numeritoMagico;

	unsigned int obtenerTamanioTabla();
	unsigned long funcionHashing(Registro *unRegistro);
	void persistirVector(vector<unsigned int> vec, fstream *archivo, const char* nombre_archivo);
	unsigned int extraerNroNuevoBloque();
	vector<unsigned int> cargarArchivoBloquesLibres();
	vector<unsigned int> cargarTablaDispersion();
	void duplicarTabla(unsigned int posicion_en_tabla);
	void incrementarTabla(unsigned int posicion_en_tabla);
	void expandirHash(unsigned int posicion_en_tabla);
	void reducirHash(unsigned int posicion_en_tabla);
};

#endif /* HASH_H_ */
